package cn.hc.sp06.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import web.util.JsonResult;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 海绵宝宝
 * date 2021/11/9 22:29
 */
@Component
public class LoginFilter extends ZuulFilter {
    /**
     *
     * Zuul的api网关所有的功能都通过过滤器实现
     * 过滤器类型：
     * pre(前置过滤器),
     * routing(路由过滤器),
     * post(后置过滤器),
     * error(错误过滤器)
     */

    /*
    filterType返回的是一个过滤器的类型
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    /*
   位置顺序号
   给大家再说一个小的知识点，如果咱们用的是前置过滤器（pre）。那么zuul在前置过滤器中放了一组默认的过滤器
   这个方法可以指定你把你自定义的过滤器放在哪块。类似于数组下标
   zuul的前置过滤器默认有5个，后边可以看一下这五个过滤器是什么
    */
    @Override
    public int filterOrder() {
        return 6;
    }

    /*
    判断针对当前请求，是否要执行过滤代码
     */
    @Override
    public boolean shouldFilter() {
        //1.获取当前请求调用的服务id
        //首先要得到服务的请求上下文对象(当前请求的上下文对象)
        RequestContext ctx = RequestContext.getCurrentContext();
        //拿到属性值,两种方式
//        ctx.get("serviceId");
        String serviceID = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);
        //2.判断服务id是不是item-service
        //这个比较方法，忽略大小写
        //如果返回true，那么就需要执行下边的run方法
        return "item-service".equalsIgnoreCase(serviceID);
    }


    /*
   过滤代码。在这编写你的过滤条件，他和shouldFilter()是绑定的
   因为有的请求是需要过滤权限的。
   有的请求不需要过滤权限。
   比如登录这个请求就需要过滤
   比如一个普通的商品列表，就不需要权限了。登录之后任何情况都能访问
   但是你访问订单的话，就必须有权限
    */
    @Override
    public Object run() throws ZuulException {
        //我们之前是不是在url中加了一个token
        //http://127.0.0.1:3001/item-service/ya13jifa?token=2yha123
        //咱们现在要获取这个token参数
        //获取token的话，要先得到request对象
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String token = request.getParameter("token");
        if(StringUtils.isEmpty(token)){
            ctx.setSendZuulResponse(false);
            //直接向客户端返回响应：JsonResult={code:400,msg:"not login!",data:null}
            //在06中加一个sp01依赖
            String json = JsonResult.err().code(JsonResult.NOT_LOGIN).msg("Gun!!!").toString();
            //设置HTTP协议头属性：Content-Type:application/json;charset=UTF-8
            ctx.addZuulResponseHeader("Content-Type","application/json;charset=UTF-8");
            ctx.setResponseBody(json);
        }
        return null;
    }
}
